﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//复盘
//int main()
//{
//	int arr1[2 - 3 + 3] = { 0 };//可以用常量表达式设置数组的大小
//
// //C99标准支持变长数组，支持用变量定义数组的大小。但用变量定义的数组不能初始化
//	int n = 0;
//	scanf("%d", &n);
//	int arr[n];
//
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int arr[n];
//	int i = 0;
//	for (i = 0; i < n; i++)
//		scanf("%d", arr[i]);
//	for (i = 0; i < n; i++)
//		printf("%d", arr[i]);
//
//	return 0;
//}
// 
// 
//  //数组的初始化：创建数组的同时给数字的内容一些合理的初始值
//int main()
//{
//	int arr[10] = { 1,2,3 };
//	return 0;
//}
//int main()
//{
//	int arr1[10] = { 'a',98,'c'};//数组为整型，则其中的字符在电脑中的存储为对应的ASCII值
//	char arr2[10] = { 'a',98,'c' }；
//	char arr3[10] = "abcdef";
//	char arr4[] = "abc";
//	char arr5[3] = { 'a','b','c' };
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };//数组不完全初始化
//	int i = 0;
//	for (i = 0; i < 10; i++)
//		//scanf("%d", &arr[i]);//数组的输入
//		arr[i] = 10-i;
//	for (i = 0; i < 10; i++)
//		printf("%d ", arr[i]);//输出
//		return 0;
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);//通过数组在计算机内存的大小来计算数组中元素的个数
//	
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		arr[i] = i;//数组的输入
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);//输出
//	}
//	return 0;
//}

//数组在内存中连续存放，
//随着下标的增长，地址由低到高 
// 由低到高
//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[i]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("arr[%d] = %p\n", i, &arr[i]);
//	}
//	printf("arr[1] = %p", &arr[0]+1);
//	return 0;
//}

//int main()
//{
//	int arr[][10] = { {1,2,3,4},{2,3,4} };//行的大小可不写
//	return 0;
//}

//二维数组的输出/打印
//int main()
//{
//	int arr1[3][4] = { 0 };
//	int i = 0;//下标
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 4; j++)
//		{
//			//scanf("%d",&arr1[i][j]);
//			arr1[i][j] = i * 4 + j;
//		}
//	}
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 4; j++)
//		{
//			printf("arr1[%d][%d] = %d\n",i,j, arr1[i][j]);
//		}
//	}
//
//	return 0;
//}


//二维数组的 地址输出/打印        //二维数组在内存中的存储
//int main()
//{
//	int arr[3][4] = { 0 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for(j = 0;j < 4;j++)
//		{
//			//scanf("%d", &arr[i][j]);
//			arr[i][j] = i * 4 + j;
//		}
//	}
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 4; j++)
//		{
//			printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);
//		}
//	}
//	return 0;
//}

//数组越界
//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	for (i = 0; i < 11; i++)
//		arr[i] = i;
//	for (i = 0; i < 11; i++)
//		printf("%d ", arr[i]);
//	return 0;
//}



//数组作为函数参数   //数组传参
//void bubble_sort(int arr[])
//{
//	int j = 0;
//	int sz = 0;
//	//int sz = sizeof(arr) / sizeof(arr[0]);
//	for (j = 0; j < sz - 1; j++)//趟数   
//	{
//		int i = 0;
//		for (i = 0; i < sz - 1 - j; i++)//升序   i是下标
//		{
//			int a = arr[i];//比较交换
//			arr[i] = arr[i+1];
//			arr[i + 1] = a;
//		}
//	}
//}
//
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr);//arr是首元素地址
//	for(i = 0; i < 10;i++)
//	printf("%d ", arr[i]);
//
//	return 0;
//}




//数组名是什么int main()
//{
//	int arr[10] = { 1,2 };
//	printf("%p\n", arr);
//	printf("%p\n", &arr[0]);
//	printf("%d\n", *arr);
//	printf("%p\n", &arr);
//	printf("%p\n", arr + 1);
//	printf("%p\n", &arr[0] + 1);
//	printf("%p\n", &arr + 1);
//	return 0;
//}
//


//作业
//创建一个整形数组，完成对数组的操作
//实现函数init() 初始化数组为全0
//实现print()  打印数组的每个元素
//实现reverse()  函数完成数组元素的逆置。
//要求：自己设计以上函数的参数，返回值。
#include <stdio.h>

//void init(int *arr[], int n)
//{
//	int i = 0;
//	for (i = 0; i < n; i++)
//	{
//		*arr = 0;
//		arr++;
//	}
//}
//
//int main()
//{
//	int arr[10] = { 0 };
//	init(arr, 10);
//	printf("%d\n", arr);
//
//	return 0;
//}

//int my_strlen(char* str)
//{
//	int count = 0;
//	if ('\0' != *str)
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//int my_strlen(char* str)
//{
//	if ('\0' == *str)
//		return 0;
//	else
//	{
//		return 1 + my_strlen(str + 1);
//	}
//}
//
//实现print()  打印数组的每个元素
//void print(char* str, char* end)
//{
//	//if (str <= end)
//	//{
//	//	printf("%c ", *str);
//	//	return print(str + 1, end);
//	//}
//	
//	//更清晰明了的方式
//	//if (str > end)//限制条件
//	//	      ;//开始回归
//	//else
//	//{
//	//	printf("%c ", *str);
//	//	return print(str + 1, end);
//	//}
//}
//
//int main()
//{
//	char arr[100] = { 0 };
//	scanf("%s", arr);
//	int sz = my_strlen(arr);
//	char* end = arr + sz - 1;
//	print(arr, end);
//	return 0;
//}


//或
//打印字符串
//void print(char* str, int sz)
//{
//	char* end = str + sz - 1;
//	for (; str <= end; str++)
//	{
//		printf("%c ", *str);
//	}
//}


//int main()
//{
//	int  arr[100] = { 0 };
//	scanf("%s", arr);
//	int sz = my_strlen(arr);
//	print(arr, sz);
//	return 0;
//}

////或
//void print(int* str, int sz)
//{
//	int* end = str + sz - 1;
//	do 
//	{
//		printf("%d ", *str);
//		str +=1;
//	} while (str <= end);
//}
//
//int main()
//{
//	int  arr[] = { 3,44,55,5 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	print(arr, sz);
//	return 0;
//}


//实现reverse()函数完成数组元素的逆置。
//int my_strlen(char* str)
//{
//	if ('\0' == *str)
//		return 0;
//	else
//		return 1 + my_strlen(str + 1);
//}
//
//void reverse(char* str, char* end)
//{
//	//char tmp = 0;
//	//while (str < end)
//	//{
//	//	tmp = *str;
//	//	*str = *end;
//	//	*end = tmp;
//	//	str++;
//	//	end--;
//	//}
//
//	if (str < end)
//	{
//		char tmp = *str;
//		*str = *end;
//		*end = tmp;
//		reverse(str + 1, end - 1);
//	}
//}
//int main()
//{
//	char arr[100] = { 0 };
//	scanf("%s", arr);
//	int sl = my_strlen(arr);
//	char* end = arr + sl - 1;
//	reverse(arr, end);
//	printf("%s\n", arr);
//	return 0;
//}


////实现print()打印数组的每个元素
//
//#include <stdio.h>
//
//void print(int* str, int* end)
//{
//	if (str < end)
//	{
//		printf("%d ", *str);
//	    print(str + 1, end);
//	}
//}
//
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* end = arr + sz - 1;
//	print(arr, end);
//	return 0;
//}



////实现reverse()函数完成数组元素的逆置。
//
//#include <stdio.h>
//﻿﻿
//void reverse(int arr[], int* end)
//{
//	if (str < end)
//	{
//		int tmp = *str;
//		*str = *end;
//		*end = tmp;
//		reverse(str + 1, end - 1);
//	}
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* end = arr + sz - 1;
//	reverse(arr, end);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d\n", arr[i]);
//	}
//	return 0;
//}



//实现一个对整形数组的冒泡排序
void bubble_sort(int str[], int sz)
{
	
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if(str[j] > str[j + 1])
			{
				int tmp = str[j];
				str[j] = str[j + 1];
				str[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 3,4,1,2,6,8,7,10,9,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}


	return 0;
}






